#!/usr/bin/env python3
"""
Media Create GUI - Quick Start Script
快速启动脚本 - 一键启动整个系统
"""

import os
import sys
import subprocess
import time
import argparse
from pathlib import Path
import signal
import asyncio
from typing import Optional

# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).parent))

# 颜色输出
class Colors:
    GREEN = '\033[92m'
    BLUE = '\033[94m'
    YELLOW = '\033[93m'
    RED = '\033[91m'
    BOLD = '\033[1m'
    RESET = '\033[0m'

def print_header():
    """打印启动头信息"""
    print(f"{Colors.BOLD}{Colors.BLUE}")
    print("╔══════════════════════════════════════════════════════════════╗")
    print("║                    🎨 Media Create GUI                     ║")
    print("║                AI多模态内容生成平台                        ║")
    print("║                      v1.0.0                               ║")
    print("╚══════════════════════════════════════════════════════════════╝")
    print(f"{Colors.RESET}")

def check_requirements():
    """检查系统要求"""
    print(f"{Colors.YELLOW}🔍 检查系统要求...{Colors.RESET}")
    
    # 检查 Python 版本
    if sys.version_info < (3, 11):
        print(f"{Colors.RED}❌ Python 3.11+ 是必需的，当前版本: {sys.version}{Colors.RESET}")
        return False
    
    # 检查虚拟环境
    if not Path(".venv").exists():
        print(f"{Colors.RED}❌ 虚拟环境未找到，请先运行 setup_dev_env.py{Colors.RESET}")
        return False
    
    # 检查 .env 文件
    if not Path(".env").exists():
        print(f"{Colors.RED}❌ .env 文件未找到，请复制 .env.example 并配置{Colors.RESET}")
        return False
    
    print(f"{Colors.GREEN}✅ 系统要求检查通过{Colors.RESET}")
    return True

def check_database():
    """检查数据库连接"""
    print(f"{Colors.YELLOW}🔍 检查数据库连接...{Colors.RESET}")
    
    try:
        # 加载环境变量
        from dotenv import load_dotenv
        load_dotenv()
        
        # 获取数据库URL
        database_url = os.getenv("DATABASE_URL")
        if not database_url:
            print(f"{Colors.RED}❌ 未找到 DATABASE_URL 环境变量{Colors.RESET}")
            print(f"{Colors.YELLOW}💡 请确保 .env 文件中配置了 DATABASE_URL{Colors.RESET}")
            return False
        
        # 简单的数据库连接测试
        from src.media_create.core.database import check_db_connection, init_database_engine
        import asyncio
        
        # 初始化数据库引擎
        try:
            init_database_engine(database_url)
        except Exception as e:
            print(f"{Colors.RED}❌ 数据库引擎初始化失败: {e}{Colors.RESET}")
            print(f"{Colors.YELLOW}💡 请检查数据库URL格式是否正确{Colors.RESET}")
            return False
        
        async def test_connection():
            return await check_db_connection()
        
        result = asyncio.run(test_connection())
        
        if result:
            print(f"{Colors.GREEN}✅ 数据库连接正常{Colors.RESET}")
            return True
        else:
            print(f"{Colors.RED}❌ 数据库连接失败{Colors.RESET}")
            print(f"{Colors.YELLOW}💡 请确保 PostgreSQL 正在运行，并检查 .env 中的数据库配置{Colors.RESET}")
            print(f"{Colors.YELLOW}💡 当前配置: {database_url}{Colors.RESET}")
            return False
            
    except Exception as e:
        print(f"{Colors.RED}❌ 数据库检查失败: {e}{Colors.RESET}")
        print(f"{Colors.YELLOW}💡 请确保 PostgreSQL 已正确安装和配置{Colors.RESET}")
        return False

def run_database_migration():
    """运行数据库迁移"""
    print(f"{Colors.YELLOW}🔄 运行数据库迁移...{Colors.RESET}")
    
    try:
        result = subprocess.run(
            [sys.executable, "-m", "alembic", "upgrade", "head"],
            capture_output=True,
            text=True,
            cwd=Path.cwd()
        )
        
        if result.returncode == 0:
            print(f"{Colors.GREEN}✅ 数据库迁移完成{Colors.RESET}")
            return True
        else:
            print(f"{Colors.RED}❌ 数据库迁移失败: {result.stderr}{Colors.RESET}")
            return False
    except Exception as e:
        print(f"{Colors.RED}❌ 数据库迁移异常: {e}{Colors.RESET}")
        return False

def start_backend_service(host: str = "127.0.0.1", port: int = 8039, workers: int = 1):
    """启动后端服务"""
    print(f"{Colors.YELLOW}🚀 启动后端服务...{Colors.RESET}")
    
    try:
        # 设置环境变量
        env = os.environ.copy()
        
        # 构建启动命令
        if workers == 1:
            # 开发模式
            cmd = [
                sys.executable, "-m", "uvicorn",
                "src.media_create.main:app",
                "--reload",
                f"--host={host}",
                f"--port={port}",
                "--log-level=info"
            ]
        else:
            # 生产模式
            cmd = [
                sys.executable, "-m", "uvicorn",
                "src.media_create.main:app",
                f"--host={host}",
                f"--port={port}",
                f"--workers={workers}",
                "--log-level=info"
            ]
        
        print(f"{Colors.BLUE}📡 后端服务地址: http://{host}:{port}{Colors.RESET}")
        print(f"{Colors.BLUE}📚 API 文档: http://{host}:{port}/docs{Colors.RESET}")
        print(f"{Colors.BLUE}🏥 健康检查: http://{host}:{port}/health{Colors.RESET}")
        
        # 启动后端服务
        process = subprocess.Popen(cmd, env=env)
        
        print(f"{Colors.GREEN}✅ 后端服务启动成功{Colors.RESET}")
        return process
        
    except Exception as e:
        print(f"{Colors.RED}❌ 后端服务启动失败: {e}{Colors.RESET}")
        return None

def start_desktop_app():
    """启动桌面应用"""
    print(f"{Colors.YELLOW}🖥️  启动桌面应用...{Colors.RESET}")
    
    try:
        # 启动桌面应用（在后台）
        cmd = [sys.executable, "src/desktop/main.py"]
        
        print(f"{Colors.BLUE}🎯 桌面应用正在启动...{Colors.RESET}")
        
        # 启动桌面应用
        process = subprocess.Popen(cmd)
        
        print(f"{Colors.GREEN}✅ 桌面应用启动成功{Colors.RESET}")
        return process
        
    except Exception as e:
        print(f"{Colors.RED}❌ 桌面应用启动失败: {e}{Colors.RESET}")
        return None

def run_health_check():
    """运行健康检查"""
    print(f"{Colors.YELLOW}🏥 运行健康检查...{Colors.RESET}")
    
    try:
        import requests
        import time
        
        # 等待服务启动
        time.sleep(3)
        
        # 基础健康检查
        response = requests.get("http://127.0.0.1:8039/health", timeout=5)
        
        if response.status_code == 200:
            health_data = response.json()
            if health_data.get("overall_health", False):
                print(f"{Colors.GREEN}✅ 系统健康检查通过{Colors.RESET}")
                return True
            else:
                print(f"{Colors.RED}❌ 系统健康检查失败{Colors.RESET}")
                return False
        else:
            print(f"{Colors.RED}❌ 健康检查 HTTP 错误: {response.status_code}{Colors.RESET}")
            return False
            
    except ImportError:
        print(f"{Colors.YELLOW}⚠️  requests 库未安装，跳过健康检查{Colors.RESET}")
        return True
    except Exception as e:
        print(f"{Colors.RED}❌ 健康检查失败: {e}{Colors.RESET}")
        return False

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="Media Create GUI 快速启动脚本")
    parser.add_argument("--host", default="127.0.0.1", help="服务器主机地址")
    parser.add_argument("--port", type=int, default=8039, help="服务器端口")
    parser.add_argument("--workers", type=int, default=1, help="工作进程数")
    parser.add_argument("--no-desktop", action="store_true", help="不启动桌面应用")
    parser.add_argument("--skip-health-check", action="store_true", help="跳过健康检查")
    parser.add_argument("--skip-migration", action="store_true", help="跳过数据库迁移")
    
    args = parser.parse_args()
    
    print_header()
    
    # 步骤 1: 系统检查
    if not check_requirements():
        return 1
    
    # 步骤 2: 数据库检查
    if not check_database():
        print(f"{Colors.YELLOW}⚠️  数据库检查失败，但仍将继续启动...{Colors.RESET}")
        input("按 Enter 继续，或 Ctrl+C 退出...")
    
    # 步骤 3: 数据库迁移
    if not args.skip_migration:
        if not run_database_migration():
            print(f"{Colors.RED}❌ 数据库迁移失败，无法继续{Colors.RESET}")
            return 1
    
    # 步骤 4: 启动后端服务
    backend_process = start_backend_service(args.host, args.port, args.workers)
    if not backend_process:
        return 1
    
    # 步骤 5: 启动桌面应用 (可选)
    desktop_process = None
    if not args.no_desktop:
        desktop_process = start_desktop_app()
    
    # 步骤 6: 健康检查
    if not args.skip_health_check:
        if not run_health_check():
            print(f"{Colors.YELLOW}⚠️  健康检查失败，请检查日志{Colors.RESET}")
    
    # 完成信息
    print(f"\n{Colors.BOLD}{Colors.GREEN}")
    print("╔══════════════════════════════════════════════════════════════╗")
    print("║                    🎉 启动完成！                           ║")
    print("║                                                              ║")
    print(f"║  🌐 后端服务: http://{args.host}:{args.port}                  ║")
    print(f"║  📚 API 文档: http://{args.host}:{args.port}/docs            ║")
    print(f"║  🏥 健康检查: http://{args.host}:{args.port}/health          ║")
    if desktop_process:
        print("║  🖥️  桌面应用: 正在运行                                     ║")
    print("║                                                              ║")
    print("║  💡 按 Ctrl+C 停止服务                                     ║")
    print("╚══════════════════════════════════════════════════════════════╝")
    print(f"{Colors.RESET}")
    
    # 等待用户中断
    try:
        backend_process.wait()
    except KeyboardInterrupt:
        print(f"\n{Colors.YELLOW}🛑 正在停止服务...{Colors.RESET}")
        
        # 停止后端服务
        backend_process.terminate()
        backend_process.wait()
        
        # 停止桌面应用
        if desktop_process:
            desktop_process.terminate()
            desktop_process.wait()
        
        print(f"{Colors.GREEN}✅ 服务已停止{Colors.RESET}")
    
    return 0

if __name__ == "__main__":
    # 确保在正确的目录
    project_root = Path(__file__).parent
    os.chdir(project_root)
    
    sys.exit(main())